from __future__ import division
import sys,os,time
from src.Equipments.LockIn import SR830
from src.Equipments.RFGenerator import E8257D
from src.Equipments.multimeter import AgilentMulti
from src.Equipments.gaussmeter import Lakeshore455

from src.Data.DataStructure import Data

import numpy as np
import matplotlib.pyplot as plt

User="PierreAndre"
#import pylab as plb
home_path=os.getcwd()+os.sep#Current path to this program
sys.path.append(home_path+"src"+os.sep)
data_path=home_path+"Users"+os.sep+User+os.sep+"data"+os.sep#For saving later on data
#print data_path

#########################################################
### Parameters - Sweeping settings
#########################################################
#frequency_start=7033-100 #MHz
#frequency_stop=7033+100 #MHz
number_of_points=2*60*2 #Total number of points
#Minimum waiting time = about 300 ms (plot time is limitant)
waiting_time=500	#ms, Waiting time for each point
test=True #If standalone without anything connected->True
#########################################################
#########################################################


#########################################################
### Parameters - Multimeter
#########################################################
multi=AgilentMulti("GPIB0::13::INSTR",test)
#########################################################
#########################################################

#########################################################
### Parameters - Gaussmeter
#########################################################
gaussmeter=Lakeshore455("GPIB0::12::INSTR",test)
#########################################################
#########################################################

#########################################################
### Parameters - RF setup
#########################################################
if False:
	RF=E8257D("GPIB0::10::INSTR","FM",test)
	RF.Set_Modulation(5232,100)	#Frequency Hz, Modulation deviation kHz / amplitude dB
	RF.Set_Modulation_Output(False,False)	#Modulation On = True, LFOutput On = True
	RF.Set_Power(3)	#dBm
	RF.Set_Frequency(frequency_start)
	RF.Set_Output_ONOFF(True)
#########################################################
#########################################################


#########################################################
### Parameters - Data saving
#########################################################
data=Data(given_name="SiBi-650C-vac-NoRF",
		path=data_path,
		comments="Bi:448.507,Bf:453.629,NoRF",
		rows=number_of_points,
		columns=2,#Field, A channel
		light=True,
		temperature=15,#K
		scan_mode="field",
		phase=0,#in degree
		modulation_frequency=100,#in kHz
		modulation_amplitude=1,#in mT
		receiver_mode=2,
		receiver_gain=1000,
		time_constant=0.3, #in s
		frequency=9.08229,#GHz
		power=50,#mW
		picture_saving_format='eps',
		user=User)
data.step=0 #Initial value
#########################################################
#########################################################

#########################################################
### Measure
#########################################################
def DoMeasure(arg):
	#Change frequency
	#frequency=frequency_start+i*(frequency_stop-frequency_start)/(number_of_points-1)
	#RF.Set_Frequency(frequency)#MHz
	#data.data[i,0]=frequency
	ti=time.time()
	if data.step <number_of_points-1:
		data.data[data.step,0]=gaussmeter.Measure_Field()
		data.data[data.step,1]=multi.Measure()
		print "B0 = ",data.data[data.step,0]," mT, A = ",data.data[data.step,1],"V"
		#print "f = ",frequency,"MHz, A = ",data.data[i,1],"V, B = ",data.data[i,2],"V"
		data.step+=1
	elif data.step == number_of_points-1:
		data.data[data.step,0]=gaussmeter.Measure_Field()
		data.data[data.step,1]=multi.Measure()
		print "B0 = ",data.data[data.step,0]," mT, A = ",data.data[data.step,1],"V"
		data.Save_data()
		#has to be after data.Save_data because that method fill the self.full_saving_path value
		plt.savefig(data.full_saving_path+'.'+data.picture_saving_format,format=data.picture_saving_format)
		data.step+=1
		print "Complete."
	else:
		pass
	DoTime=time.time()-ti
	if waiting_time-DoTime*1000<=0:
		DeltaTDo=waiting_time
	else:
		DeltaTDo=waiting_time-DoTime*1000
	TimerDo.interval=DeltaTDo
#########################################################
#########################################################


#########################################################
### Plotting
#########################################################
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.grid(True)
ax.set_title("Magnetic field sweep")
ax.set_xlabel("Magnetic field (mT)")
ax.set_ylabel("SDR signal (V)")
ax.axis([0,1,0,1])
line=ax.plot([0,1],[0,1],'o-')
manager = plt.get_current_fig_manager()

def RealtimePloter(arg):
	global values
	ti=time.time()
	if data.step>0:
		line[0].set_data(data.data[0:data.step,0],data.data[0:data.step,1])
		ax.axis([data.data[0:data.step,0].min(),data.data[0:data.step,0].max(),data.data[0:data.step,1].min(),data.data[0:data.step,1].max()])
		manager.canvas.draw()
	PlotTime=time.time()-ti
	if waiting_time-PlotTime*1000<=0:
		DeltaTPlot=waiting_time
	else:
		DeltaTPlot=waiting_time-PlotTime*1000
	TimerPlot.interval=DeltaTPlot
	#manager.show()



TimerPlot = fig.canvas.new_timer(interval=waiting_time)
TimerPlot.add_callback(RealtimePloter, ())
TimerDo = fig.canvas.new_timer(interval=waiting_time)
TimerDo.add_callback(DoMeasure, ())
TimerPlot.start()
TimerDo.start()

plt.show()
#########################################################
#########################################################